const express = require('express');
const app = express();
const path = require('path');
const multer = require('multer');
const fs = require('fs');
const moment = require('moment');

app.use(express.static(path.join(__dirname, 'public')));

const upload = multer({ 
  dest: 'files/',
  fileFilter(req, file, callback) {
    // 解决中文名乱码的问题
    file.originalname = Buffer.from(file.originalname, "latin1").toString(
      "utf8"
    );
    callback(null, true);
  },
});

// app.get('/', (req, res) => {
//   res.sendFile(path.join(__dirname, 'index.html'));
// });

// 上传接口：上传文件，同时保存在files文件夹中
app.post('/upload', upload.single('file'), (req, res) => {
  const file = req.file;
  console.log(file)
  // 将file根据file.originalname重命名并且保存在files文件夹中
  const filePath = path.join('files', decodeURI(file.originalname));
  fs.renameSync(file.path, filePath);
  res.json({ message: 'File uploaded successfully', filePath });
});

//文件下载的路由
app.get('/download', function (req, res) {
  //接收文件名称
  let { name } = req.query
  //如果参数中有中文，需要解码
  name = decodeURI(name)
  //判断该文件是否存在
  fs.access(`files/${name}`, function (err) {
    if (!err) {
      res.set({
        //告诉浏览器这是一个二进制文件
        "Content-Type": "application/octet-stream",
        //告诉浏览器这是一个需要下载的文件，使用encodeURI方法，是为了避免中文名称下载时出问题
        "Content-Disposition": `attachment;filename=${encodeURI(name)}`
      })
      //使用流读取文件，并响应给客户端
      fs.createReadStream(`files/${name}`).pipe(res)
    }
  })
})

app.get('/del', function (req, res) {
  //接收文件名的参数
  let { name } = req.query
  //如果参数中有中文，需要解码
  name = decodeURI(name)
  console.log(name)
  //删除 files 目录下的该文件
  fs.unlink(`files/${name}`, function (err) {
    res.send('文件已删除')
  })
})

// 获取files目录下所有文件，返回文件名称、文件大小以及文件路径
app.get('/files', (req, res) => {
  const files = fs.readdirSync('files');
  const fileInfo = files.map(file => {
    const filePath = path.join('files', file);
    const stats = fs.statSync(filePath);
    const ctime = moment(stats.ctime).format('YYYY-MM-DD HH:mm:ss');
    return {
      name: file,
      size: stats.size,
      ctime,
      path: filePath
    }
  });
  res.json(fileInfo.sort((a, b) => new Date(b.ctime) - new Date(a.ctime)));
})

// 删除过期文件，默认是三天
app.get('/delOldFiles', (req, res) => {
  const directory = 'files'; // 指定要删除文件的目录

  let { day } = req.query;

  fs.readdir(directory, (err, files) => {
    if (err) {
      res.status(500).send('读取目录时发生错误');
      return;
    }

    files.forEach((file) => {
      console.log(file)
      const filePath = path.join(directory, file);
      const stats = fs.statSync(filePath);
      const modifiedDate = stats.mtime;

      const fiveDaysAgo = Date.now() - (day * 24 * 60 * 60 * 1000);

      if (modifiedDate < fiveDaysAgo) {
        fs.unlinkSync(filePath);
        console.log(`${filePath} 已删除`);
      }
    });

    res.json('文件已删除');
  });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});